perm filename FWH.FRM[P,JRA] blob
sn#461543 filedate 1979-07-25 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00001 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 ENDMK
C⊗;
∂03-Apr-79 1041 FWH
PASCAL
% ST in terms: TRUE if term is a variable.
SL in termlists: TRUE if list is NOT empty ("NIL").
SS in substitutions: TRUE if sub is identity (empty subst.).
FL in substitutions: TRUE if object is not a unifier (used for
returning failure).
%
TYPE VAR = INTEGER; % dummy type definition %
TYPE FCN = INTEGER; % dummy type definition %
TYPE TERM = RECORD ST:BOOLEAN; VT:VAR; FNLT:FCN; ARGS: ↑TERMLIST END;
TYPE TERMLIST = RECORD SL:BOOLEAN; HD: TERM; TL: ↑TERMLIST END;
TYPE SINGLESUB = RECORD VR:VAR;TM:TERM END;
TYPE SUB = RECORD FL:BOOLEAN; SS:BOOLEAN; CAR:SINGLESUB; CDR: ↑SUB END;
VAR S,ZEROSUB: SUB;
X,Y: TERMLIST;
PROCEDURE TSUBSTP(X:TERM; S:SUB; VAR Y:TERM);
EXIT Y=TSUBST(X,S);
EXTERNAL;
FUNCTION PAIR(X:TERM; Y:TERM):SUB;
ENTRY ISVAR(X) ∧ ¬OCCUR(X,Y);
EXIT MGUT(X,Y,PAIR) ∧ MGUT(Y,X,PAIR);
EXTERNAL;
PROCEDURE SCOMPP(VAR S1:SUB; S2:SUB);
INITIAL S1=S0;
EXIT S1=SCOMP(S0,S2);
EXTERNAL;
FUNCTION OCCUR(X:TERM; Y:TERM):BOOLEAN; EXIT TRUE; EXTERNAL;
% CHECK WHETHER VARIABLE X.VT OCCURS IN Y %
PROCEDURE UNIFY(X,Y:TERMLIST; VAR S:SUB);
VAR X1,Y1: TERMLIST;
X2,Y2: TERM;
S2: SUB;
BEGIN
% Initialization of variables %
S:=ZEROSUB;
X1:=X;
Y1:=Y;
WHILE X1.SL AND Y1.SL AND NOT(S.FL) DO
BEGIN
TSUBSTP(X1.HD,S,X2);
TSUBSTP(Y1.HD,S,Y2);
IF X2.ST THEN IF Y2.ST
THEN BEGIN IF (X2≠Y2) THEN SCOMPP(S,PAIR(X2,Y2));
% If X2=Y2 nothing need be done %
END
ELSE IF OCCUR(X2,Y2) THEN S.FL:=TRUE
ELSE SCOMPP(S,PAIR(X2,Y2))
ELSE
IF Y2.ST THEN IF OCCUR(Y2,X2) THEN S.FL:=TRUE
ELSE SCOMPP(S,PAIR(Y2,X2))
ELSE
IF X2.FNLT=Y2.FNLT THEN BEGIN UNIFY(X2.ARGS↑, Y2.ARGS↑, S2);
IF S2.FL THEN S.FL:=TRUE
% S2 is not a unifier, but indicates failure %
ELSE SCOMPP(S,S2)
END
ELSE S.FL:=TRUE;
X1:=X1.TL↑;
Y1:=Y1.TL↑;
END; % End of WHILE body %
IF X1.SL OR Y1.SL THEN S.FL:=TRUE;
END; % Procedure body %
∂08-May-79 1224 FWH
∂06-May-79 0946 RED pascal
believe it or not i think i have a unifier that will work. At least it
compiles, I haven't yet gotten the courage up to run it on anything.
My immediate problem is how to accomplish a standardize-apart in
pascal. I think I need the equivalent of GENSYM but I can't think of
any straightforward way to write one in pascal....any ideas?
ruth
--- If you are using records and pointers (as you probably have to in Pascal
anyway) then the NEW should give you a new pointer. However, if all you need
is just atoms than you have to implement a gensym yourself. After all, Pascal
is not the language to simulate Lisp in; it does not give you ANYTHING for
free.... By the way, how much differs your unifier from our old program ?
Wanna get it "verified"? Friedrich